package rdfParser;

/**
 *
 * @author folone.org.ua
 */
import java.util.*;
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.w3c.dom.html.*;
import org.xml.sax.*;

public class document {
    
    private HTMLDocument _document;
    
    public document(HTMLDocument doc) {
        _document = doc;
    }
    /**
     * Отыскиваем все пространства имён, пишем в вектор
     * @author folone.org.ua
     */
    private Vector<String> getRdfNamespaces () throws Exception{
        
        Vector<String> namespaces = new Vector();
        if(_document.getFirstChild() == null)
        throw new Exception("Invalid document"); //Плохой код
        
        NodeList list = _document.getElementsByTagNameNS("rdf", "*");
        for (int i=0; i<list.getLength(); i++) {
            if(list.item(i).hasAttributes()) {
                NamedNodeMap attributes = list.item(i).getAttributes();
                for (int j=0; j<attributes.getLength(); j++) {
                    if (attributes.item(j).getNodeName().equals("xmlns")){
                        namespaces.add(attributes.item(j).getNodeValue());
                    }
                }
            }
        }
        return namespaces;
    }
    
    /**
     * Строим для пространства имён карту "атрибут - значение"
     * @author folone.org.ua
     */
    private TreeMap<String, String> getPropertiesForNamespace(String namespace){
        
        TreeMap<String, String> properties = new TreeMap();
        
        if(_document.getFirstChild() == null)
        return null; //Плохой код
        
        NodeList list = _document.getElementsByTagNameNS(namespace, "*");
        
        for (int i=0; i<list.getLength(); i++) {
            properties.put(list.item(i).getNodeName(), list.item(i).getNodeValue());
        }
        
        return properties;
    }
    
    /**
     * Строим карту "пространство имён - карта значений"
     * @author folone.org.ua
     */
    public TreeMap<String, TreeMap> parseRdf() throws Exception{
        Vector<String> namespaces = new Vector();
        TreeMap<String, TreeMap> result = new TreeMap();
        
        try {
            namespaces = getRdfNamespaces();
        }
        catch (Exception e) {
            throw new Exception(e);
        }
        
        Iterator itr = namespaces.iterator();
        
        while (itr.hasNext()){
            String tmp = new String();
            tmp = itr.next().toString();
            result.put(tmp, getPropertiesForNamespace(tmp));
        }
        
        return result;
    }
}
